package com.example.myDesignPatterns.softwareDesignPrinciples.迪米特法则;

import com.example.myDesignPatterns.softwareDesignPrinciples.迪米特法则.assembly.Fans;
import com.example.myDesignPatterns.softwareDesignPrinciples.迪米特法则.assembly.Star;
import com.example.myDesignPatterns.softwareDesignPrinciples.迪米特法则.finishedProduct.Agent;

public class explain {
    /**
     * 迪米特法则又叫最少知识原则。
     *
     * 只和你的直接朋友交谈，不跟“陌生人”说话（Talk only to your immediate friends and not to strangers）。
     *
     * 其含义是：如果两个软件实体无须直接通信，那么就不应当发生直接的相互调用，可以通过第三方转发该调用。其目的是降低类之间的耦合度，提高模块的相对独立性。
     *
     * 迪米特法则中的“朋友”是指：当前对象本身、当前对象的成员对象、当前对象所创建的对象、当前对象的方法参数等，这些对象同当前对象存在关联、聚合或组合关系，可以直接访问这些对象的方法。
     *
     * 下面看一个例子来理解迪米特法则
     *
     * 【例】明星与经纪人的关系实例
     *
     * 明星由于全身心投入艺术，所以许多日常事务由经纪人负责处理，如和粉丝的见面会，和媒体公司的业务洽淡等。这里的经纪人是明星的朋友，而粉丝和媒体公司是陌生人，所以适合使用迪米特法则。
     *
     */
    public static void main(String[] args) {
        Agent agent = new Agent();
        Star star = new Star("周杰伦");
        agent.setStar(star);
        agent.setFans(new Fans("张三"));
        agent.meeting();


    }
    /**
     *
     迪米特法则（Law of Demeter，LoD），又称最少知识原则（The Least Knowledge Principle），是一种面向对象设计中的指导原则。该法则强调软件实体（如类、模块、函数等）应当尽可能减少与其他实体的交互，以降低耦合度并提高模块的独立性。
     迪米特法则的核心思想可以总结为“Talk Only To Your Friends”（只与你的直接朋友交流），这里的“朋友”指的是：
     对象自己创建的对象。
     作为方法参数传入的对象。
     方法返回的对象。
     对象的直接持有者（如对象的属性）。
     遵循迪米特法则的好处包括：
     降低耦合度：通过限制类之间直接的交互，减少了系统中各部分之间的依赖，使得修改或替换某个部分时，对其他部分的影响降到最低。
     提高模块性：每个模块更加独立，专注于自己的责任，易于理解和维护。
     简化单元测试：由于类之间的交互减少且明确，编写单元测试时可以更容易地模拟依赖关系。
     增强封装性：鼓励通过接口而非实现细节进行编程，保护了实现细节，实现了信息隐藏。
     在实际应用中，为了遵循迪米特法则，可能需要引入中间层或适配器来转发请求，而不是让对象直接与非直接朋友通信。设计模式如门面模式（Facade）和中介者模式（Mediator）就是基于迪米特法则来减少系统间的耦合度。public class Star {
     private String name;

     public Star(String name) {
     this.name=name;
     }

     public String getName() {
     return name;
     }
     }
     */
}
